static char * termread(char *ibuf, int size);
static void termwrite(char *obuf, int size);
static double mag2degrees(double mag_val);
+static void mag_readmsg(void);
typedef enum {
mrs_handoff = 0,
- mrs_handon
+ mrs_handon,
+ mrs_awaiting_ack
} mag_rxstate;
/*
mag_writemsg(const char * const buf)
{
unsigned int osum = mag_checksum(buf);
+ int retry_cnt = 20;
int i;
char obuf[1000];
if (debug_serial) {
fprintf(stderr,"WRITE: $%s*%02X\r\n",buf, osum);
}
-#if 0
- retry:
-#endif
+
+ retry:
+
i = sprintf(obuf, "$%s*%02X\r\n",buf, osum);
termwrite(obuf, i);
-
-#if 0
- if (magrxstate == mrs_handon) {
+ if (magrxstate == mrs_handon || magrxstate == mrs_awaiting_ack) {
+ magrxstate = mrs_awaiting_ack;
mag_readmsg();
if (last_rx_csum != osum) {
-fprintf(stderr, "E");
- goto retry;
+ if (debug_serial) {
+ fprintf(stderr, "COMM ERROR: Expected %02x, got %02x",
+ osum, last_rx_csum);
+ }
+ if (retry_cnt--)
+ goto retry;
+ else
+ fatal(MYNAME
+ ": Too many communication errors.\n");
}
}
-#endif
}
static void
mag_writeack(int osum)
{
char obuf[200];
+ char nbuf[200];
+ int i;
+ unsigned int nsum;
+
if (is_file) {
return;
}
- sprintf(obuf, "PMGNCSM,%02X", osum);
- mag_writemsg(obuf);
+
+ i = sprintf(nbuf, "PMGNCSM,%02X", osum);
+ nsum = mag_checksum(nbuf);
+ i = sprintf(obuf, "$%s*%02X\r\n",nbuf, nsum);
+
+ if (debug_serial) {
+ fprintf(stderr,"ACK WRITE: %s",obuf);
+ }
+ /*
+ * Don't call mag_writemsg here so we don't get into ack feedback
+ * loops.
+ */
+ termwrite(obuf, i);
}
static void
mag_handon(void)
{
- magrxstate = mrs_handon;
-
if (!is_file) {
mag_writemsg("PMGNCMD,HANDON");
}
+ magrxstate = mrs_handon;
+
}
static void
mag_handoff(void)
{
- magrxstate = mrs_handoff;
if (!is_file) {
mag_writemsg("PMGNCMD,HANDOFF");
}
+ magrxstate = mrs_handoff;
}
void
}
if (IS_TKN("$PMGNCSM,")) {
last_rx_csum = strtoul(&ibuf[9], NULL, 16);
+ magrxstate = mrs_handon;
return;
}
if (strncmp(ibuf, "$PMGNWPT,", 7) == 0) {
ignore_unable = 1;
mag_writemsg("PMGNCMD,NMEAOFF");
}
+
return;
}
fatal(MYNAME ": Routes are not yet supported\n");
}
- while (!found_done)
+ while (!found_done) {
mag_readmsg();
+ }
}
static
free(odesc);
if (!is_file) {
- mag_readmsg();
if (mag_error) {
fprintf(stderr, "Protocol error Writing '%s'\n", obuf);
}
static void
mag_write(void)
{
- if (!is_file) {
- mag_readmsg();
-#if !__WIN32__
- /*
- * I have no idea why this is fatal under Windows.
- */
- mag_readmsg();
- mag_readmsg();
- mag_readmsg();
-#endif
- }
/*
* Whitespace is actually legal, but since waypoint name length is
* only 8 bytes, we'll conserve them.